#include "Stack.h"
#include <map>
#include <string>

//int main()
//{
//	int ret = Add(1, 2);
//
//	return 0;
//}

//void TestAuto(auto a)
//{}
auto f2()
{
	auto ret = 1;
	return ret;
}

auto f1()
{
	auto x = f2();
	return x;
}

auto TestAuto()
{
	auto a = f1();
	return a;
}

//int main()
//{
//	int i = 0;
//	int j = i;
//	auto k = i;
//	// auto x;
//	auto p1 = &i;
//	auto* p2 = &i;
//	//auto* p3 = i;
//	auto& r = i;
//
//	//void(*pf1)(int, int) = func;
//	//auto pf2 = func;
//
//	//cout << typeid(pf1).name() << endl;
//	//cout << typeid(pf2).name() << endl;
//
//	std::map<std::string, std::string> dict;
//	//std::map<std::string, std::string>::iterator it = dict.begin();
//	auto it = dict.begin();
//
//	// cout << typeid(it).name() << endl;
//
//	auto it2 = TestAuto();
//
//	return 0;
//}

//void TestFor(int array[])
//{
//	for (auto& e : array)
//		cout << e << endl;
//}

//int main()
//{
//	int array[] = { 1, 2, 3, 4, 5 };
//
//	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
//		array[i] *= 2;
//
//	for (int* p = array; p < array + sizeof(array) / sizeof(array[0]); ++p)
//		cout << *p << endl;
//
//	// C++11
//	// 依次取数组中值赋值给e，自动迭代，自动判断结束
//	for (auto& e : array)
//	{
//		e *= 2;
//	}
//	cout << endl;
//
//	for (auto e : array)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	return 0;
//}

void f(int i)
{
	cout << "f(int)" << endl;
}

void f(int* p)
{
	cout << "f(int*)" << endl;
}

// 10:45
//int main()
//{
//	f(0);
//	f(NULL);
//	f((int*)NULL);
//	f(nullptr);
//
//	int* p = nullptr;
//
//	return 0;
//}

///////////////////////////////////////////////////////////////////
// C++ 兼容c struct的用法
// 但是同时升级成了类


//int main()
//{
//	//struct Stack st1;
//
//	Stack st2;
//	st2.top = 0;
//
//	st2.Init();
//	st2.Push(1);
//	st2.Push(2);
//	st2.Push(3);
//
//
//	return 0;
//}

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
	//private:
	int _year;   // 声明还是定义？
	int _month;
	int _day;
};

//int main()
//{
//	//class Date d0;
//	Date d1;    // 定义，对象实例化
//	//Date::_year++;  // 不能因为他只是声明
//	d1._year++;
//
//	cout << sizeof(d1) << endl;
//
//	d1.Init(2024, 1, 24);
//	//d1._day++;
//	d1.Print();
//
//	return 0;
//}

//class A2 {
//public:
//	void f2() {}
//};

class A3
{};

//int main()
//{
//	Date d1;
//	Date d2;
//	d1._year;
//	d2._year;
//
//	d1.Print();
//	d2.Print();
//
//	// 没有成员变量的类对象大小1byte,占位，标识对象实例化时，定义出来存在过
//	cout << sizeof(A2) << endl;
//	cout << sizeof(A3) << endl;
//
//	A2 aa1;
//	A2 aa2;
//
//	return 0;
//}

class A2 {
public:
	void f2()
	{
		cout << "void f2()" << endl;
	}
};

int main()
{
	/*int i = 0;
	int j;*/

	A2 a2;
	A2* p1 = &a2;
	p1->f2();

	// 编译错误
	// 运行错误
	// 正常运行
	A2* p2 = nullptr;
	p2->f2();

	return 0;
}